class Stack<T> {
  constructor(private items: T[] = []) {}

  // 添加一个或多个元素到栈顶
  push(...element: T[]): void {
    // console.log(element)
    // console.log(this.items)
    this.items = this.items.concat(element)
  }

  // 移除栈顶的元素，同时返回被移除的元素。
  pop(): T | undefined {
    return this.items.pop()
  }

  // 返回栈顶的元素，不对栈做任何修改(该方法不会移除栈顶的元素，仅仅返回它)
  peek(): T | undefined {
    return this.items[this.size() - 1]
  }

  // 如果栈里没有任何元素就返回 true，否则返回 false。
  isEmpty(): boolean {
    return this.size() === 0
  }

  // 移除栈里的所有元素
  clear(): void {
    this.items = []
  }

  // 返回栈里的元素个数。该方法和数组的 length 属性很类似。
  size(): number {
    return this.items.length
  }
}

export default Stack
